package br.com.sgh.arquitetura.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;


/**
 * 
 * <p>
 * DAO
 * </p>
 * <p>
 * Descrição: Interface para acesso a base de dados já com métodos de manutenção (CRUD) pré-definidos.
 * </p>
 * <br>
 * <b>Empresa:</b> Chesf - Companhia Hidro Elétrica do São Francisco <E> entidade a ser manipulada
 * 
 * @author Rafael Veloso
 * @author Anderson Fonseca
 * @version 1.0
 * @param E entidade que será manipulada
 */
public interface DAO<E> {

	/**
	 * Busca a entidade pelo seu identificador.
	 * 
	 * @param identificador
	 *            O identificador da entidade
	 * 
	 * @return Entidade pesquisada
	 */
	E obter(Serializable identificador);
	
	/**
	 * Busca as entidades pelos seus identificadores.
	 * 
	 * @param identificador
	 *            Os identificadores da entidades
	 * 
	 * @return Entidade pesquisada
	 */
	Collection<E> obter(Collection<Serializable> ids);

	/**
	 * Insere o objeto informado como parametro na entidade gerenciada por esta
	 * classe.
	 * 
	 * @param entidade
	 *            Objeto da entidade
	 * 
	 * @return Chave da entidade inserida na base de dados, podendo ser um
	 *         objeto com mais de um atributo representando a chave
	 */
	Serializable inserir(E entidade);

	/**
	 * Altera a entidade na base de dados.
	 * 
	 * @param entidade
	 *            Objeto da entidade
	 */
	void alterar(E entidade);

	/**
	 * Inseri o objeto caso ele não exista, senão, atualiza o objeto na
	 * entidade.
	 * 
	 * @param entidade
	 *            Objeto da entidade
	 */
	void salvar(E entidade);

	/**
	 * Altera a entidade passada por parâmetro fazendo um "merge" com a entidade
	 * existente na sessão do Hibernate (caso exista).
	 * 
	 * @param entidade
	 *            Entidade a ser salva.
	 */
	void mesclar(E entidade);

	/**
	 * Remove o objeto da entidade gerenciada por esta classe.
	 * 
	 * @param entidade
	 *            Objeto da entidade
	 */
	void remover(E entidade);

	/**
	 * Remove todos os objetos informados como parametro da entidade gerenciada
	 * por esta classe.
	 * 
	 * @param entidades
	 *            Objetos da entidade
	 */
	void removerTodos(Collection<E> entidades);
	
	/**
	 * Remove as entidades cujos IDs são passdos como parâmetros.
	 * 
	 * @param ids
	 *            Ids das entidades
	 */
	void removerTodosPorId(Collection<Serializable> ids);

	/**
	 * Consulta os objetos que possuirem os valores dos atributos do objeto
	 * informado.
	 * 
	 * @param entidade
	 *            Objeto que será utilizado como parâmetro na consulta.
	 * 
	 * @return Coleção das entidades encontradas.
	 */
	Collection<E> consultar(E entidade);

	/**
	 * Consultar todos os objetos da entidade.
	 * 
	 * @return Coleção de todas objetos da entidade
	 */
	Collection<E> consultar();

	/**
	 * Lista todos os objetos da entidade sem efetuar controle de paginacao.
	 * 
	 * @return Lista de todas objetos da entidade
	 */
	List<E> listar();
	
	  /**
     * Get the Class of the entity.
     *
     * @return the class
     */
    Class<E> getEntityClass();
	
}